////////package cn.hongxin.sap.interface.aspect;
//
//import cn.getech.poros.framework.common.api.RestResponse;
//import cn.getech.poros.framework.common.bean.UserBaseInfo;
//import cn.getech.poros.framework.common.context.PorosContextHolder;
//import cn.getech.poros.permission.client.PermissionDataRuleClient;
//import cn.getech.poros.permission.client.PorosSecMenuClient;
//import cn.getech.poros.permission.dto.MenuSearchUrlParam;
//import cn.getech.poros.permission.dto.PorosSecMenu;
//import cn.getech.poros.permission.dto.SysPermissionDataRule;
//import cn.hongxin.busi.common.annotation.PermissionData;
//import cn.hongxin.busi.common.system.util.FxDataAutorUtils;
//import cn.hongxin.busi.common.system.vo.SysPermissionDataRuleModel;
//import cn.hongxin.busi.common.util.SpringContextUtils;
//import cn.hongxin.busi.common.util.oConvertUtils;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.aspectj.lang.reflect.MethodSignature;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.AntPathMatcher;
//import org.springframework.util.PathMatcher;
//
//import javax.servlet.http.HttpServletRequest;
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.stream.Collectors;
//
///**
// * 数据权限切面处理类
// * 当被请求的方法有注解PermissionData时,会在往当前request中写入数据权限信息
// *
// * @Date 2019年4月10日
// * @Version: 1.0
// */
//@Aspect
//@Component
//@Slf4j
//public class PermissionDataAspect {
//
//
//    @Autowired
//    private PermissionDataRuleClient permissionDataRuleClient;
//
//    @Autowired
//    private PorosSecMenuClient porosSecMenuClient;
//
//
//    @Pointcut("@annotation(cn.hongxin.busi.common.annotation.PermissionData)")
//    public void pointCut() {
//
//    }
//
//    @Around("pointCut()")
//    public Object arround(ProceedingJoinPoint point) throws Throwable {
//        HttpServletRequest request = SpringContextUtils.getHttpServletRequest();
//        MethodSignature signature = (MethodSignature) point.getSignature();
//        Method method = signature.getMethod();
//        PermissionData pd = method.getAnnotation(PermissionData.class);
//        String component = pd.pageComponent();
//        List<PorosSecMenu> currentSyspermission = null;
//        RestResponse<List<PorosSecMenu>> restResponse = null;
//        if (oConvertUtils.isNotEmpty(component)) {
//            //1.通过注解属性pageComponent 获取菜单
//            LambdaQueryWrapper<PorosSecMenu> query = new LambdaQueryWrapper<>();
//            query.eq(PorosSecMenu::getSysId, 0);
//            query.eq(PorosSecMenu::getComponentPath, component);
//
//            MenuSearchUrlParam menuSearchUrlParam = new MenuSearchUrlParam();
//            menuSearchUrlParam.setSysId(82L);
//            menuSearchUrlParam.setComponentPath(component);
//
//            try {
//                restResponse = porosSecMenuClient.listAll(menuSearchUrlParam);
//                log.info("调用[permission]服务1--返回值：{}", JSONObject.toJSONString(restResponse));
//                currentSyspermission = restResponse.getData();
//            } catch (Exception e) {
//                log.error("[调用权限服务失败1-porosSecMenuClient.listAll]", e);
//            }
//        } else {
//            String requestMethod = request.getMethod();
//            String requestPath = request.getRequestURI().substring(request.getContextPath().length());
//            requestPath = filterUrl(requestPath);
//            log.info("拦截请求 >> " + requestPath + ";请求类型 >> " + requestMethod);
//            //1.直接通过前端请求地址查询菜单
//            MenuSearchUrlParam menuSearchUrlParam = new MenuSearchUrlParam();
//            menuSearchUrlParam.setResourceType("1");
//            menuSearchUrlParam.setSysId(82L);
//            menuSearchUrlParam.setUrl(requestPath);
//
//            try {
//                restResponse = porosSecMenuClient.listAll(menuSearchUrlParam);
//                log.info("调用[permission]服务2--返回值：{}", JSONObject.toJSONString(restResponse));
//                currentSyspermission = restResponse.getData();
//            } catch (Exception e) {
//                log.error("[调用权限服务失败2-porosSecMenuClient.listAll]", e);
//            }
//
//            //3.未找到 再通过正则匹配获取菜单
//            if (currentSyspermission == null || currentSyspermission.size() == 0) {
//                //通过正则匹配权限配置
//                String regUrl = getRegexpUrl(requestPath);
//                if (regUrl != null) {
//                    try {
//                        MenuSearchUrlParam urlParam = new MenuSearchUrlParam();
//                        urlParam.setResourceType("1");
//                        urlParam.setUrl(regUrl);
//                        urlParam.setSysId(82L);
//                        restResponse = porosSecMenuClient.listAll(urlParam);
//                        log.info("调用[permission]服务3--返回值：{}", JSONObject.toJSONString(restResponse));
//                        currentSyspermission = restResponse.getData();
//                    } catch (Exception e) {
//                        log.error("[调用权限服务失败3-porosSecMenuClient.listAll]", e);
//                    }
//                }
//            }
//        }
//        //3.通过用户名+菜单ID 找到权限配置信息 放到request中去
//        if (currentSyspermission != null && currentSyspermission.size() > 0) {
//            UserBaseInfo currUser = PorosContextHolder.getCurrentUser();
//            List<SysPermissionDataRuleModel> dataRules = new ArrayList<>();
//            for (PorosSecMenu sysPermission : currentSyspermission) {
//                RestResponse<List<SysPermissionDataRule>> listRestResponse = null;
//                try {
//                    listRestResponse = permissionDataRuleClient.queryPermissionDataRules(currUser.getUid(), String.valueOf(sysPermission.getId()));
//                    if (listRestResponse.isSuccess()) {
//                        List<SysPermissionDataRule> temp = listRestResponse.getData();
//                        if (temp != null && temp.size() > 0) {
//                            dataRules = oConvertUtils.entityListToModelList(temp, SysPermissionDataRuleModel.class);
//                        }
//                    }
//                } catch (Exception e) {
//                    log.error("[调用权限服务失败4-permissionDataRuleClient.queryPermissionDataRules]", e);
//                }
//            }
//            if (dataRules != null && dataRules.size() > 0) {
//                FxDataAutorUtils.installDataSearchConditon(request, dataRules);
//                FxDataAutorUtils.installUserInfo(request, currUser);
//            }
//        }
//        return point.proceed();
//    }
//
//    private String filterUrl(String requestPath) {
//        String url = "";
//        if (oConvertUtils.isNotEmpty(requestPath)) {
//            url = requestPath.replace("\\", "/");
//            url = requestPath.replace("//", "/");
//            if (url.contains("//")) {
//                url = filterUrl(url);
//            }
//			/*if(url.startsWith("/")){
//				url=url.substring(1);
//			}*/
//        }
//        return url;
//    }
//
//    /**
//     * 获取请求地址
//     *
//     * @param request
//     * @return
//     */
//    private String getJgAuthRequsetPath(HttpServletRequest request) {
//        String queryString = request.getQueryString();
//        String requestPath = request.getRequestURI();
//        if (oConvertUtils.isNotEmpty(queryString)) {
//            requestPath += "?" + queryString;
//        }
//        if (requestPath.indexOf("&") > -1) {// 去掉其他参数(保留一个参数) 例如：loginController.do?login
//            requestPath = requestPath.substring(0, requestPath.indexOf("&"));
//        }
//        if (requestPath.indexOf("=") != -1) {
//            if (requestPath.indexOf(".do") != -1) {
//                requestPath = requestPath.substring(0, requestPath.indexOf(".do") + 3);
//            } else {
//                requestPath = requestPath.substring(0, requestPath.indexOf("?"));
//            }
//        }
//        requestPath = requestPath.substring(request.getContextPath().length() + 1);// 去掉项目路径
//        return filterUrl(requestPath);
//    }
//
//    private boolean moHuContain(List<String> list, String key) {
//        for (String str : list) {
//            if (key.contains(str)) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    /**
//     * 匹配前端传过来的地址 匹配成功返回正则地址
//     * AntPathMatcher匹配地址
//     * ()* 匹配0个或多个字符
//     * ()**匹配0个或多个目录
//     */
//    private String getRegexpUrl(String url) {
//        List<PorosSecMenu> secMenus;
//        try {
//            LambdaQueryWrapper<PorosSecMenu> queryWrapper = new LambdaQueryWrapper<>();
//            queryWrapper.like(PorosSecMenu::getUrl, url);
//
//            MenuSearchUrlParam urlParam = new MenuSearchUrlParam();
//            urlParam.setUrl(url);
//            urlParam.setSysId(82L);
//
//            RestResponse<List<PorosSecMenu>> restResponse = porosSecMenuClient.listAll(urlParam);
//            log.info("调用[permission]服务5--返回值：{}", JSONObject.toJSONString(restResponse));
//            secMenus = restResponse.getData();
//            List<String> list = secMenus.stream().map(PorosSecMenu::getUrl).collect(Collectors.toList());
//            if (list.size() > 0) {
//                for (String p : list) {
//                    PathMatcher matcher = new AntPathMatcher();
//                    if (matcher.match(p, url)) {
//                        return p;
//                    }
//                }
//            }
//        } catch (Exception e) {
//            log.error("[调用权限服务失败5-porosSecMenuClient.listAll]", e);
//        }
//
//
//        return null;
//    }
//
//}
